/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util;

import java.io.*;
import java.util.Hashtable;

/**
 *
 * @author Ruben
 */
public class IlusLexer {

    Reader reader;
    StreamTokenizer tokenizer;
    int lienaActual = 0;
    Hashtable simbolos;
    Token tokenActual;
    Token TokenAnterior;

    public IlusLexer(Reader rdr) throws IOException {
        reader = rdr;
        simbolos = new Hashtable();
        tokenizer = new StreamTokenizer(reader);
        tokenizer.lowerCaseMode(true);
        tokenizer.eolIsSignificant(true);
        tokenizer.slashStarComments(true);
        tokenActual = getSiguienteToken();
    }

    public IlusLexer(String archivo) throws IOException {

        //FileReader fr=new FileReader(archivo);
        //BufferedReader b=new BufferedReader(fr);
        this(new BufferedReader(new FileReader(archivo)));
       

    }

    private Token getSiguienteToken() throws IOException {
        int tokenTipo = tokenizer.nextToken();
        //System.out.println(tokenTipo);
        switch (tokenTipo) {
            case StreamTokenizer.TT_EOF:
                return new Token(TipoToken.EOF, "");
            case StreamTokenizer.TT_EOL:
                lienaActual += 1;
                return getSiguienteToken();
            case StreamTokenizer.TT_NUMBER:
                //System.out.println("Encontro el número " + tokenizer.nval);
                return new Token(TipoToken.NUMERO, (int) tokenizer.nval);
            case StreamTokenizer.TT_WORD:
                //System.out.println(tokenizer.sval);
                PalabraClave pres = PalabraClave.buscarPalabra(tokenizer.sval);

                if (pres != null) {
                    //System.out.println("El token es " + pres.getToken());
                    //System.out.println("El tipo de token " + pres.getTipoToken());
                    return new Token(pres.getTipoToken(), pres.getToken());
                }
                Accion acc = Accion.buscarAccion(tokenizer.sval);
                if (acc != null) {
                    //System.out.println("Accion encontrada: " + acc.getToken());
                    if(acc.getTipoToken()==TipoToken.DESCUBRE){
                        return new Token(TipoToken.DESCUBRE,acc.getToken());
                    }
                    else{
                        return new Token(acc.getTipoToken(), acc.getToken());
                    }
                    
                }
                return new Token(TipoToken.NOMBRE, tokenizer.sval);
                
            //FALTA AGREEGAR MAS CASOS
            default:
                //System.out.println("Token desconocido= " + (char) tokenTipo);
                StringBuffer sb = new StringBuffer();
                sb.append((char) tokenTipo);
                return new Token(TipoToken.CHAR, sb.toString());
        }
    }

    public boolean sacarToken(Token tk) {
        if (TokenAnterior == null) {
            TokenAnterior = tk;
        } else {
            throw (new IllegalArgumentException("Ya se ha sacado el token"));
        }
        return true;
    }

    public Token verToken() {
        if (TokenAnterior == null) {
            return tokenActual;
        } else {
            return TokenAnterior;
        }
    }

    public Token siguienteToken() throws IOException {
        if (TokenAnterior == null) {
            Token value = tokenActual;
            tokenActual = getSiguienteToken();
            return value;
        } else {
            Token value = TokenAnterior;
            TokenAnterior = null;
            return value;
        }
    }

    public void insertarSimbolo(String symbol, int cod) {
        String sym = symbol.intern();
        simbolos.put(sym, new Simbolo(sym,cod));
    }

    public Simbolo buscarSimbolo(String simbolo) {

        Simbolo s = (Simbolo) simbolos.get(simbolo.intern());
        return s;
    }

    public Token getTokenActual() {
        return tokenActual;
    }
/*
    //PRUEBA MAIN EN CLASE LEXER
    public static void main(String args[]) {

        
         * System.out.println("IlusLexer.main\n"); if (args.length < 1) {
         * System.err.println("usar: Lexer <nombre del archivo>\n");
         * System.exit(1);
	}
         

        try {
            String program = "program avanzar GIRARNORTE inicio FIN abrircerramiento detener girarsur procedimiento";
            StringReader input = new StringReader(program);




            IlusLexer lex = new IlusLexer(input);
            //IlusLexer l = new IlusLexer(args[0]);




            Token tok;
            while ((tok = lex.siguienteToken()) != null) {
                //System.out.println("token: " + tok.cadenaValor);
                //System.out.println("ver: " + lex.verToken());
                //System.out.println();
                if (tok.getTipo() == TipoToken.EOF) {
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
*/
}
